/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package modlemgooglesvn.modlem_src;


/**
 * Klasa Tree<T> - drzewo
 * @author kodatnik.blogspot.com
 */
class Tree<T> {

 private Node<T> root;
 private StringBuilder output;

 public Tree() {
  root = null;
 }

 public Tree(Node<T> root) {
  this.root = root;
 }

 public Node<T> getRoot() {
  return root;
 }

 public void preOrder() {
  preOrder(root);
 }

 public void postOrder() {
  postOrder(root);
 }

 public void inOrder() {
  inOrder(root);
 }

// metoda wyświetla węzły w kolejności preorder
public void preOrder(Node<T> n) {
 //najpierw korzeń
 System.out.print(n + " ");
 // potem lewe skrajne poddrzewo, a później prawe
 Node<T> temp = n.getLeftMostChild();
 while (temp != null) {
  preOrder(temp);
  temp = temp.getRightSibling();
 }
}

// metoda wyświetla węzły w kolejności postorder
public void postOrder(Node<T> n) {
 // najpierw lewe skrajne poddrzewo, potem prawe
 Node<T> temp = n.getLeftMostChild();
 while (temp != null) {
  postOrder(temp);
  temp = temp.getRightSibling();
 }
 // na końcu korzeń
 System.out.print(n + " ");
}

// metoda wyświetla węzły w kolejności inorder
public void inOrder(Node<T> n) {
 if (n.isLeaf())
  System.out.print(n + " ");
 else {
  // najpierw lewe skrajne poddrzewo
  Node<T> temp = n.getLeftMostChild();
  inOrder(temp);
  // potem korzeń
  System.out.print(n + " ");
  // potem prawe
  temp = temp.getRightSibling();
  while (temp != null) {
   inOrder(temp);
   temp = temp.getRightSibling();
  }
 }
}

 // metoda zwraca poziom węzła
 public int getLevel(Node<T> n) {
  if (n == root) return 0;
  else return 1 + getLevel(n.getParent());
 }

 private void makeTreeStringOutline(Node<T> n) {
  for(int i=0; i < getLevel(n); i++) output.append("\t");
  output.append(n + "\n");
  Node<T> temp = n.getLeftMostChild();
  while (temp != null) {
   makeTreeStringOutline(temp);
   temp = temp.getRightSibling();
  }
 }

 private void makeTreeStringBrackets(Node<T> n) {
  output.append(n);
  Node<T> temp = n.getLeftMostChild();
  if( temp != null) output.append("(");
  while (temp != null) {
   makeTreeStringBrackets(temp);
   temp = temp.getRightSibling();
   if (temp != null) output.append(", ");
   else output.append(")");
  }
 }

 public String toString() {
  output = new StringBuilder();

  makeTreeStringOutline(root); // reprezentacja drzewiasta
  //makeTreeStringBrackets(root); // reprezentacja z nawiasami

  return output.toString();
 }
}